package cn.twh.wall.util;

import ognl.Ognl;
import ognl.OgnlContext;
import ognl.OgnlException;

import java.util.Map;

/**
 * ongl工具类
 *
 * @author TWH
 */
public class OgnlUtil {
    /**
     * 获取 objec 类型返回值
     *
     * @param root     根map
     * @param ognlExpr ognl表达式
     * @return 获取到的值
     * @throws OgnlException 当ognl表达式错误，或者表达式取不到指定值时抛出该异常
     */
    public static Object getObjectValue(Map<?, ?> root, String ognlExpr) throws OgnlException {
        OgnlContext ognlContext = new OgnlContext(null, null, new DefaultMemberAccess(true));
        Object exp = Ognl.parseExpression(ognlExpr);
        return Ognl.getValue(exp, ognlContext, root);
    }

    /**
     * 获取 T 类型返回值
     *
     * @param root     根map
     * @param ognlExpr ognl表达式
     * @param <T>      响应泛型
     * @return 接收的是什么类型就强转成什么类型
     * @throws OgnlException 当ognl表达式错误，或者表达式取不到指定值时抛出该异常
     */
    @SuppressWarnings("unchecked")
    public static <T> T getValue(Map<?, ?> root, String ognlExpr) throws OgnlException {
        return (T) getObjectValue(root, ognlExpr);
    }
}